package com.ewayde.base.statemachine;
/**
 *
 * 表示状态和事件之间的关联叫状态转换Transition
 *
 * 描述了系统从一个状态转换到另一个状态的过程。转换是由特定的事件触发的。
 */
public interface Transition<S,E,C> {

    /**
     * 获取当前转换之前的状态
     * @return 转换前的状态
     */
    State<S,E,C> getSourceState();

    /**
     * 设置转换前的状态
     * @param sourceState 转换前的状态
     */
    void setSourceState(State<S,E,C> sourceState);

    /**
     * 获取当前转换发生的事件
     * @return 事件
     */
    E getEvent();

    /**
     * 设置转换事件
     * @param event E
     */
    void setEvent(E event);

    /**
     * 获取转换后的状态
     * @return 转换后的状态 target State
     */
    State<S,E,C> getTargetState();

    /**
     * 设置转换后的状态
     * @param state 转换后的状态 target State
     */
    void setTargetState(State<S, E, C> state);


    /**
     * 获取转换完成后执行的动作
     */
    Action<S,E,C> getAction();

    /**
     * 设置当前转换后要完成的动作
     */
    void setAction(Action<S, E, C> action);

    /**
     * 获取转换的条件
     */
    Condition<C> getCondition();
    /**
     * 设置转换的条件
     */
    void setCondition(Condition<C> condition);

    /**
     * DO 转换
     * @param ctx 实例
     * @return 转换后的状态
     */
    State<S, E, C> transit(C ctx, boolean checkCondition);

    boolean verify();
}
